package main

import (
	"fmt"
	"math/rand"
	"time"
)

// BubbleSort 冒泡排序
func BubbleSort(arr []int) []int {
	// 循环体
	for i := 0; i < len(arr)-1; i++ {
		//-i是为了节省内存
		for j := 0; j < len(arr)-1-i; j++ {
			// 升序
			if (arr)[j] > (arr)[j+1] {
				// 交换
				(arr)[j], (arr)[j+1] = (arr)[j+1], (arr)[j]
			}
		}
	}
	return arr
}

// InsertNum 插入数字排序
func InsertNum(arr1 []int, num int) []int {
	fmt.Println("插入数组===>", arr1, "长度===>", len(arr1))
	fmt.Println("插入数字===>", num)
	arr2 := make([]int, len(arr1)+1)
	var byEnd = len(arr1)
	for k, v := range arr1 {
		if num <= v {
			byEnd = k
			break
		}
	}
	// 创建另一个空间存放目标下标前面的数组
	copy(arr2, arr1[:byEnd])
	// 创建另一个空间存放目标下标后面的数组
	var sliceArr2 = arr1[byEnd:]
	//追加插入值
	var sliceArr3 = append(arr2[:byEnd], num)
	// 后面的数组追加到前面的数组
	sliceArr3 = append(sliceArr3, sliceArr2...)
	return sliceArr3
}

// GenerateRandomArray 生成一串随机数组
func GenerateRandomArray(length int) []int {
	var sliceArr []int
	for i := 0; i < length; i++ {
		// time.Now().Unix()返回一个从1970:1:1到现在所经过的秒数
		rand.Seed(time.Now().UnixNano())
		n := rand.Intn(100) + 1
		sliceArr = append(sliceArr, n)
		// 增加随机数混乱度
		time.Sleep(5)
	}
	return sliceArr
}
func main() {
	// 已知有个排序好（升序）数组，要求插入一个元素，最后打印该数组，顺序依然是升序

	//arr1 := []int{1, 2, 2, 4}
	var array = InsertNum(BubbleSort(GenerateRandomArray(10)), 5)
	fmt.Println(array, "长度===>", len(array))
}
